package org.dromara.quick.chat.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.github.linpeilie.annotations.AutoMapper;
import io.github.linpeilie.annotations.AutoMappers;
import lombok.Data;
import org.dromara.common.mongo.dto.GeoDTO;
import org.dromara.quick.chat.model.vo.ImSocialPostBasicVO;
import org.dromara.quick.chat.model.vo.ImSocialPostDetailVO;
import org.dromara.quick.chat.model.vo.ImSocialPostVO;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 社交软件中的动态表，用于存储用户发布的动态相关信息
 * @TableName im_social_post
 */
@TableName(value ="im_social_post")
@Document(collection = "im_social_post")
@Data
@AutoMappers({
    @AutoMapper(target = ImSocialPostBasicVO.class),
    @AutoMapper(target = ImSocialPostVO.class),
    @AutoMapper(target = ImSocialPostDetailVO.class)
})
public class ImSocialPost implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * (唯一标识) 动态表中每条动态记录的唯一编号，系统自动生成，用于区分不同的动态记录
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * (用户编号) 发布该动态的用户编号，关联平台用户表中的用户编号
     */
    private Long userId;

    /**
     * (IP 属地) 发布动态时用户的 IP 所属地区
     */
    private String ipLocation;

    /**
     * (动态内容) 动态包含的文字信息
     */
    private String postContent;

    /**
     * (图片集) 动态关联的多张图片的地址，以 JSON 数组形式存储
     */
    private List<String> imageSet;

    /**
     * (动态失效时间) 超过该时间，动态及其评论将自动删除
     */
    private Date expirationTime;

    /**
     * (点赞总数) 动态获得的点赞总数，初始值为 0
     */
    private Integer likeCount;

    /**
     * (评论总数) 动态下的评论总数，初始值为 0
     */
    private Integer commentCount;

    /**
     * (转发总数) 动态被转发的总次数，初始值为 0
     */
    private Integer shareCount;

    /**
     * (地理位置) 动态发布时的地理位置信息，以 JSON 格式存储
     */
    private GeoJsonPoint geoLocation;

    /**
     * (地址名称) 动态发布地的地址名称，至少显示两级，如城市和区域
     */
    private String addressName;

    /**
     * (话题) 动态关联的话题，以 JSON 数组形式存储以 # 开头的话题
     */
    private List<String> topics;

    /**
     * (@ 好友) 动态中 @ 的好友，以 JSON 数组形式存储以 @ 开头的好友标识
     */
    private List<String> mentionedFriends;

    /**
     * (社区 id) 动态发布到的社区编号，关联社区表中的社区编号
     */
    private Long communityId;

    /**
     * (审核状态) 动态的审核状态，0 代表未审核，1 代表审核通过，2 代表审核不通过
     */
    private Integer reviewStatus;

    /**
     * (审核描述) 审核过程及结果的详细说明
     */
    private String reviewDescription;

    /**
     * (创建时间) 该动态记录的创建时间，系统自动记录
     */
    private Date createTime;

    /**
     * 是否对陌生人可见，1 表示可见，0 表示不可见
     */
    private Integer strangerVisible;

    public void setLocation(GeoDTO geoDTO) {
        if (geoDTO != null && (geoDTO.getX() != null || geoDTO.getY() != null)) {
            this.geoLocation = new GeoJsonPoint(geoDTO.getX(), geoDTO.getY());
        }
    }
}
